package com.aaa.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;

/**
 * @author ：Teacher陈（86521760@qq.com）
 * @date ：Created in 2022/6/14 15:27
 * @description：基于接口的动态代理
 * @modified By：
 * @version: 1.0
 */
public class MyDynamicProxyInterface  implements InvocationHandler {
    //声明目标对象
    private  Object targetObj;
    /**
     * @create by: Teacher陈（86521760@qq.com）
     * @description: 传入目标对象，获取代理对象
     * @create time: 2022/6/14 15:28
     * @param target  目标对象
     * @return
     */
    public Object getProxyObj(Object target){
        /**
         *  * @param   loader the class loader to define the proxy class
         *      * @param   interfaces the list of interfaces for the proxy class
         *      *          to implement
         *      * @param   h the invocation handler to dispatch method invocations to
         */
        targetObj=target;
        Object proxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        return proxyInstance;
    }
    /**
     * 处理代理实例上的方法调用并返回结果。
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
        @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //此处写增强处理的代码，日志处理
            System.out.println("动态代理日志："+method.getName()+new Date());
            //执行目标对象中的方法
            Object invoke = method.invoke(targetObj, args);
            return invoke;
    }
}
